import time

import fitz  # PyMuPDF


def replace_text_keep_style(input_pdf, output_pdf, old_text, new_text):
    # 打开原始 PDF
    input_doc = fitz.open(input_pdf)

    # 创建新 PDF
    output_doc = fitz.open()

    for page in input_doc:
        # 在新 PDF 中添加空白页（尺寸与原页相同）
        new_page = output_doc.new_page(
            width=page.rect.width,
            height=page.rect.height
        )

        # 复制原页内容到新页
        new_page.show_pdf_page(new_page.rect, input_doc, page.number)

        # 查找所有匹配的文本实例
        text_instances = page.search_for(old_text)

        # 提取原文本的字体、大小、颜色
        for inst in text_instances:
            # 获取原文本的字体和大小（通过页面文本提取）
            text_blocks = page.get_text("dict")["blocks"]
            for block in text_blocks:
                if "lines" in block:
                    for line in block["lines"]:
                        for span in line["spans"]:
                            print('span["text"]:',span["text"])
                            if old_text in span["text"]:
                                font = span["font"]  # 原字体（如 "Helvetica-Bold"）
                                # Sanitize the font name
                                font = ''.join(e for e in font if e.isalnum())
                                size = span["size"]  # 原字号（如 12.0）
                                color = span["color"]  # 原颜色（RGB 格式，如 (0, 0, 0) = 黑色
                                break

            # 用白色矩形覆盖原文本（模拟删除）
            new_page.add_redact_annot(inst, fill=(1, 1, 1))  # 白色填充
            new_page.apply_redactions()

            # 在相同位置插入新文本，保持原样式
            new_page.insert_text(
                (inst.x0, inst.y1-3),  # 原文本位置（左下角坐标）
                new_text,
                fontsize=size,  # 原字号
                #fontname=font,  # 原字体
                color=color  # 原颜色
            )

    # 保存新 PDF
    output_doc.save(output_pdf)
    input_doc.close()
    output_doc.close()


# 使用示例
filePah="E:\\Decl\\VBA程序\\分单\\sample\\"
fileName = time.strftime("%Y%m%d%H%M%S", time.localtime())
tempFile = filePah + "temp" +fileName + ".docx"
modifiedFile = filePah + "modified" +fileName + ".docx"
outFile = filePah + "out" + fileName + ".pdf"
newstr = """XINGLONG EXPRESS CO LTD
11TH FLOOR, BANTIAN CHUANGHUI INTERNATIONAL CENTER
LONGGANG DISTRICT, SHENZHEN
0755-29167914 ZIP CODE 518129
"""
print("newstr:",repr(newstr))
#replace_text_keep_style(filePah+"369-94369612-test.pdf", outFile, "FUZHOU SIHI EXPRESS INTERNATIONAL LOGISTICS CO, LTD", newstr)